/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cz.vse.adventura.po1715.xshet00_shevtsova.gui;


import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

/**
 *
 * @author TShevtsova
 */
@SuppressWarnings("serial")
class NabídkaNápověda extends JMenu
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final String TEXT_O_APLIKACI =
        "<html><font color=\"red\">Vzorové řešení</font><br>" +
        "grafického rozhraní adventury<br><br>" +
        "tentokrát již doplněné o nabídku s možností<br>" +
        "aktivovat nápovědu" +
        "</html>";



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** GUI, pro které nabídka pracuje. */
    private final IMojeGUI gui;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     * @param gui Grafické rozhraní, pro které instance pracuje
     */
    NabídkaNápověda(IMojeGUI gui)
    {
        super("Nápověda");
        this.gui = gui;
        this.setMnemonic( 'N' );

        vytvořPoložkuNápověda();
        vytvořPoložkuOAplikaci();
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Otevře aplikační okno zobrazující obsah hlavního souboru nápovědy,
     * ze kterého vedou hyperodkazy do dalších souborů.
     * Metoda umožňuje otevřít několik instancí tohoto okna
     * a v každé si zobrazit jinou čáíst nápovědy.
     */
    private void otevřiOknoSNápovědou()
    {
        JFrame      okno        = new JFrame("Nápověda");
        JEditorPane edpNápověda = new JEditorPane();

        //Připraví konfiguraci panelu s nápovědou v okně
        edpNápověda.setEditable(false);
        JScrollPane editorScrollPane = new JScrollPane(edpNápověda);
        editorScrollPane.setVerticalScrollBarPolicy(
                        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        editorScrollPane.setPreferredSize(new Dimension(250, 145));
        okno.add(editorScrollPane);

        //Naplní panel obsahem
        IGameG hra = gui.getHra();
        URL      url = hra.getHelpURL();
        try {
            edpNápověda.setPage(url);
        } catch (Exception e) {
            throw new RuntimeException(
                "\nNepodařilo se otevřít nápovědu na URL: " + url, e);
        }
        edpNápověda.addHyperlinkListener(new HLL(edpNápověda));
        okno.pack();
        okno.setVisible(true);
    }


    /***************************************************************************
     * V nabídce Nápověda vytvoří položku Nápověda,
     * po jejímž zadání se zobrazí okno s nápovědou.
     */
    private void vytvořPoložkuNápověda()
    {
        JMenuItem mniNápověda = new JMenuItem("Nápověda");
        this.add(mniNápověda);

        mniNápověda.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed( ActionEvent ae ) {
                    otevřiOknoSNápovědou();
                }
            }
        );
    }


    /***************************************************************************
     * V nabídce Nápověda vytvoří položku O aplikaci, po jejímž zadání
     * se zobrazí okno se základními informacemi o dané aplikaci.
     */
    private void vytvořPoložkuOAplikaci()
    {
        JMenuItem mniOAplikaci = new JMenuItem("O aplikaci");
        this.add(mniOAplikaci);

        mniOAplikaci.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed( ActionEvent ae ) {
                    JOptionPane.showMessageDialog(null,
                        TEXT_O_APLIKACI,
                        "Druhá vzorové řešení GUI adventury",
                        JOptionPane.PLAIN_MESSAGE);

                }
            }
        );
    }



//== INTERNÍ DATOVÉ TYPY =======================================================

    /***************************************************************************
     * Instance třídy <b><code>HLL</code></b> přestavují posluchače
     * reagující na klepnutí na hypertextový odkaz.
     *
     * @author    jméno autora
     * @author    Rudolf PECINOVSKÝ
     * @version   0.00.000, 0.0.2008
     */
    public class HLL implements HyperlinkListener
    {
    //== KONSTANTNÍ ATRIBUTY TŘÍDY =============================================
    //== PROMĚNNÉ ATRIBUTY TŘÍDY ===============================================
    //== KONSTANTNÍ ATRIBUTY INSTANCÍ ==========================================

        JEditorPane edpNapoveda;



    //== PROMĚNNÉ ATRIBUTY INSTANCÍ ============================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ====================================
    //== OSTATNÍ NESOUKROMÉ METODY TŘÍDY =======================================

    //##########################################################################
    //== KONSTRUKTORY A TOVÁRNÍ METODY =========================================

        /***********************************************************************
         *
         * @param edpNapoveda
         */
        public HLL(JEditorPane edpNapoveda)
        {
            this.edpNapoveda = edpNapoveda;
        }


    //== ABSTRAKTNÍ METODY =====================================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =================================
    //== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ====================================

        /***********************************************************************
         *
         */
        @Override
        public void hyperlinkUpdate(final HyperlinkEvent e) {
            URL url = e.getURL();
            if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                try {
                    edpNapoveda.setPage(url);
                } catch (IOException ioe) {
                    System.err.println("Netrefim na: " + url);
                }
            }
        }



    //== SOUKROMÉ A POMOCNÉ METODY TŘÍDY =======================================
    //== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ====================================
    //== VNOŘENÉ A VNITŘNÍ TŘÍDY ===============================================
    //== TESTY A METODA MAIN ===================================================
    //
    //    /*********************************************************************
    //     * Testovací metoda.
    //     */
    //    public static void test()
    //    {
    //    }
    //    /** @param args Parametry příkazového řádku - nepoužívané. */
    //    public static void main( String[] args )  {  test();  }
    }



//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        JOptionPane.showMessageDialog(null, TEXT_O_APLIKACI);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
